//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Tablero.h"
#include "VerticeNormal.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)
Tablero::Tablero(float l, float a, float g, int nL, int nA, int nG){
   largo=l;
   ancho=a;
   grosor=g;
   numPartesLargo=nL;
   numPartesAncho=nA;
   numPartesGrosor=nG;

   nV=2*nL*nA + 2*nA*nG + 2*nL*nG;
   nC=2*(nL-1)*(nA-1) + 2*(nA-1)*(nG-1) + 2*(nL-1)*(nG-1);
   nN=nV;
   vertice=new PuntoVector3D*[nV];
   normal=new PuntoVector3D*[nN];
   cara=new Cara*[nC];
   generaTablero();
}

void Tablero::generaTablero(){

        int indiceCara=0;
        int numVertice=0;
        double x,y,z,xN,yN,zN;
        double incrX=largo/(float)(numPartesLargo-1);
        double incrY=grosor/(float)(numPartesGrosor-1);
        double incrZ=ancho/(float)(numPartesAncho-1);

        //parte de abajo
        for(int i=0;i<numPartesLargo;i++)
                for(int j=0;j<numPartesAncho;j++){
                        vertice[numVertice]=new PuntoVector3D(i*incrX, 0, j*incrZ,1);
                        normal[numVertice]=new PuntoVector3D(0,-1,0,0);
                        if(i!=0 && j!=0){
                                ponVerticesCara(indiceCara,numVertice,numVertice-1,numVertice-numPartesAncho-1,numVertice-numPartesAncho);
                                indiceCara++;
                        }
                        numVertice++;
                }

        //parte de arriba
        for(int i=0;i<numPartesLargo;i++)
                for(int j=0;j<numPartesAncho;j++){
                        vertice[numVertice]=new PuntoVector3D(i*incrX, grosor, j*incrZ,1);
                        normal[numVertice]=new PuntoVector3D(0,1,0,0);
                        if(i!=0 && j!=0){
                                ponVerticesCara(indiceCara,numVertice,numVertice-1,numVertice-numPartesAncho-1,numVertice-numPartesAncho);
                                indiceCara++;
                        }
                        numVertice++;
                }
        //parte y-z con x=0
        for(int i=0;i<numPartesGrosor;i++)
                for(int j=0;j<numPartesAncho;j++){
                        vertice[numVertice]=new PuntoVector3D(0,i*incrY, j*incrZ,1);
                        normal[numVertice]=new PuntoVector3D(-1,0,0,0);
                        if(i!=0 && j!=0){
                                ponVerticesCara(indiceCara,numVertice,numVertice-1,numVertice-numPartesAncho-1,numVertice-numPartesAncho);
                                indiceCara++;
                        }
                        numVertice++;
                }
        //parte y-z con x=largo
        for(int i=0;i<numPartesGrosor;i++)
                for(int j=0;j<numPartesAncho;j++){
                        //if(i==0) delete vertice[j];
                        //if(i==numPartesGrosor-1) delete vertice[numPartesAncho*numPartesLargo + j];
                        vertice[numVertice]=new PuntoVector3D(largo,i*incrY, j*incrZ,1);
                        normal[numVertice]=new PuntoVector3D(1,0,0,0);
                        if(i!=0 && j!=0){
                                ponVerticesCara(indiceCara,numVertice,numVertice-1,numVertice-numPartesAncho-1,numVertice-numPartesAncho);
                                indiceCara++;
                        }
                        numVertice++;
                }

        //parte x-y con z=ancho
        for(int i=0;i<numPartesGrosor;i++)
                for(int j=0;j<numPartesLargo;j++){
                        vertice[numVertice]=new PuntoVector3D(j*incrX, i*incrY,ancho,1);
                        normal[numVertice]=new PuntoVector3D(0,0,1,0);
                        if(i!=0 && j!=0){
                                ponVerticesCara(indiceCara,numVertice,numVertice-1,numVertice-numPartesLargo-1,numVertice-numPartesLargo);
                                indiceCara++;
                        }
                        numVertice++;
                }

        //parte x-y con z=0
        for(int i=0;i<numPartesGrosor;i++)
                for(int j=0;j<numPartesLargo;j++){
                        vertice[numVertice]=new PuntoVector3D(j*incrX,i*incrY, 0,1);
                        normal[numVertice]=new PuntoVector3D(0,0,-1,0);
                        if(i!=0 && j!=0){
                                ponVerticesCara(indiceCara,numVertice,numVertice-1,numVertice-numPartesLargo-1,numVertice-numPartesLargo);
                                indiceCara++;
                        }
                        numVertice++;
                }

}

void Tablero::ponVerticesCara(int indiceCara, int vn1, int vn2, int vn3, int vn4){
                        cara[indiceCara]=new Cara(4);
                        cara[indiceCara]->ponVN(new VerticeNormal(vn1,vn2),0);
                        cara[indiceCara]->ponVN(new VerticeNormal(vn2,vn2),1);
                        cara[indiceCara]->ponVN(new VerticeNormal(vn3,vn3),2);
                        cara[indiceCara]->ponVN(new VerticeNormal(vn4,vn4),3);
}


